﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{

    //Task  : 5617 
    // Data : 12/03/2009
    // Autor:Apsilva
    /// <summary>
    /// Bussiness Logic de Desconto Cliente
    /// </summary>
    public class DescontoCliente : BaseBusinessLogic
    {

        #region Constantes de Erro


        private const int ERRO_APELIDOINVALIDO = 109154;
        private const int ERRO_APELIDOINVALIDOACESSOR = 109170;
        private const int ERRO_PERCENTUALINVALIDO = 109156;
        private const int ERRO_TIPOCOBRANCADIFERENTE = 109160;
        private const int ERRO_TIPOCOBRANCAIGUAL = 109161;
        private const int ERRO_DESCONTOCLIENTE_NULA = 109066;
        private const int ERRO_DUPLICADAENTITY = 109162;

        #endregion

        #region Construtor
        public DescontoCliente()
            : base()
        {

        }
        #endregion


        #region Métodos


        /// <summary>
        /// Alterar Desconto Cliente
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public void AlterarDescontoCliente(BusinessEntity.DescontoCliente request)
        {
            if (request == null)
                throw new ValidationException(ERRO_DESCONTOCLIENTE_NULA);

            ValidarDescontoCliente(request); 

            new ResourceAccess.DescontoCliente().AlterarDescontoCliente(request);
        }

        /// <summary>
        /// Consultar Descontos Clientes
        /// </summary>
        /// <param name="request"></param>

        public List<BusinessEntity.DescontoCliente> ConsultarDescontosClientes(BusinessEntity.Parameter.FiltroDescontoCliente request)
        {
            return new ResourceAccess.DescontoCliente().ConsultarDescontosClientes(request);
        }


        /// <summary>
        /// Excluir Desconto Cliente
        /// </summary>
        /// <param name="request"></param>
        public void ExcluirDescontoCliente(BusinessEntity.Parameter.FiltroDescontoCliente request)
        {
            new ResourceAccess.DescontoCliente().ExcluirDescontoCliente(request); 
        }


        /// <summary>
        /// Incluir Desconto Cliente
        /// </summary>
        /// <param name="request"></param>
        public void IncluirDescontoCliente(BusinessEntity.DescontoCliente request)
        {
            if (request == null)
                throw new BusinessException(ERRO_DESCONTOCLIENTE_NULA);

            ValidarDescontoCliente(request);

            BusinessEntity.Parameter.FiltroDescontoCliente filtro = new Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Parameter.FiltroDescontoCliente();
            filtro.CodigoCliente = request.CodigoCliente;
            filtro.TipoOperacao = request.TipoOperacao;

            if (this.ConsultarDescontosClientes(filtro).Count > 0)
                throw new ValidationException(ERRO_DUPLICADAENTITY); 
            
            new ResourceAccess.DescontoCliente().IncluirDescontoCliente(request);

        }



        #region Validação

        /// <summary>
        /// Validar se os Parametros para Desconto Cliente são válidos
        /// </summary>
        /// <param name="entity"></param>
        private void ValidarDescontoCliente(BusinessEntity.DescontoCliente entity)
        {

            validarEntidadeDescontoCliente(entity);

            Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroClientePorApelido filtro = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroClientePorApelido();
            filtro.ApelidoCliente = entity.ApelidoCliente;
            filtro.IsListaAssessores = false; 

            Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Cliente cliente =   new Sinacor.Servico.Bovespa.Cliente.BusinessLogic.Cliente().ConsultarPorApelido(filtro);

            if (cliente == null)
                throw new ValidationException(ERRO_APELIDOINVALIDO);

            filtro.IsListaAssessores = true; 
            cliente = new Sinacor.Servico.Bovespa.Cliente.BusinessLogic.Cliente().ConsultarPorApelido(filtro);


            if (cliente == null)
                throw new ValidationException(ERRO_APELIDOINVALIDOACESSOR);

            entity.CodigoCliente = cliente.Codigo; 

            
            if (entity.PercentualDescontoAcresimo < -100)
            {
                throw new ValidationException(ERRO_PERCENTUALINVALIDO);
            }

            if (entity.PercentualDescontoAcresimo < 0 && cliente.PercentualTotal != 0)
            {
                throw new ValidationException(ERRO_TIPOCOBRANCADIFERENTE); 
            }

            if (entity.PercentualDescontoAcresimo < -100 && cliente.PercentualTotal == 0)
            {
                throw new ValidationException(ERRO_TIPOCOBRANCAIGUAL); 
            }
            BusinessEntity.Parameter.FiltroDescontoCliente filtroDesconto = new Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Parameter.FiltroDescontoCliente();
            filtroDesconto.CodigoCliente = entity.CodigoCliente;
            filtroDesconto.TipoOperacao = entity.TipoOperacao; 
        }

        /// <summary>
        /// Validar RuleSets
        /// </summary>
        /// <param name="entity"></param>
        private void validarEntidadeDescontoCliente(Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.DescontoCliente entity)
        {
            SinacorValidation validar = new SinacorValidation();
            validar.Validate<BusinessEntity.DescontoCliente>(entity);
            validar.Validate();
            validar = null; 

        }
        #endregion

        #endregion


        public void AlterarDescontoClientes(List<Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.DescontoCliente> list)
        {
            foreach (BusinessEntity.DescontoCliente item in list)
            {
                AlterarDescontoCliente(item); 
            }
        }

        public void ExcluirDescontoClientes(List<Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Parameter.FiltroDescontoCliente> list)
        {
            foreach (BusinessEntity.Parameter.FiltroDescontoCliente item in list)
            {
                ExcluirDescontoCliente(item);
            }
        }

        public void IncluirDescontoClientes(List<Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.DescontoCliente> list)
        {
            foreach (BusinessEntity.DescontoCliente item in list)
            {
               IncluirDescontoCliente(item);
            }
        }
    }
}
